.model small                        ;programos kodui, duomenims ir stekui skiriama po 64k
.stack 100h                         ;steko segmentas, jo dydis bus 100h
.data                               ;duomenu segmentas

    pranesimas0 	db  0ah,0dh,"Iveskite pirma skaiciu: $"
	pranesimas1 	db  0ah,0dh,"Iveskite antra skaiciu: $"
	pranesimas2	    db  10, 13,"DBD: $"
	pranesimas3	    db  0ah, 0dh, "Neivedete jokio teksto!!!", 0ah, 0dh, " $"

.code                               ;kodo segmentas

main    proc                        ;proceduros pradzia
    
        MOV     AX, @DATA           ;i registra AX iraso paragrafo, kuriame prasideda duomenu segmentas, numeri
        MOV     DS, AX              ;registrui DS priskiriama registro AX reiksme
    
    ;cia spausdina, kai prog paleidziama "1.exe /?"
	mov bx, 80h
	mov bl, byte ptr es:[bx]
	xor bx, bx
    mov dl, byte ptr es:[83h+bx]
	cmp dl, '?'
	jne nieko
	mov dx, offset pranesimas4      ;uzkraunamas pranesimas4 adresas i DX registra
	mov ah, 09h                     ;kreipiamasi su 09h funkcija spausdinimui
	int 21h                         ;pertraukimas
nieko:
            
        LEA     DX, pranesimas0     ;uzkraunamas pranesimas1 adresas i DX registra
        MOV     AH, 09h             ;kreipiamasi su 09h funkcija spausdinimui
        INT     21h                 ;pertraukimas
    
	call get_sk                     ;iskviecia sk nuskaitymo proc
	mov si,ax	                   
         
        LEA     DX, pranesimas1     ;uzkraunamas pranesimas2 adresas i DX registra
        MOV     AH, 09h             ;kreipiamasi su 09h funkcija spausdinimui
        INT     21h                 ;pertraukimas 
         
	call get_sk                     ;iskviecia sk nuskaitymo proc
	mov di,ax
	
	    LEA     DX, pranesimas2     ;uzkraunamas pranesimas2 adresas i DX registra
        MOV     AH, 09h             ;kreipiamasi su 09h funkcija spausdinimui
        INT     21h                 ;pertraukimas 
	
	call dbd                        ;iskviecia dbd proc
    call spausdinti                 ;iskviecia ats spauzdinima

        mov     ah,4Ch              ;funkcija su numeriu 4Ch perduoda valdyma operacinei sistemai
        int     21h                 ;pertraukimas
main    endp                        ;proceduros pabaiga
;------------------------------------------------------------------------------------
base    equ     10              ;base = 10
spausdinti       proc
        push    cx              ;i steka
        push    dx
        push    ax
        mov     cx,base         ;cx = base = 10
        xor     dx,dx           ;"isimtinis arba" (cia isvalo bx)
        div     cx              ;dalina ax is cx, sveikoji dalis i ax, liekana i dx
        cmp     ax,0            ;ar ax = 0?
        je      done            
        call    spausdinti      
done:   add     dl,30h          ;i simboli
        mov     ah,02h          ;spauzdinti
        int     21h             ;pertraukimas
        pop     ax              ;is steko
        pop     dx
        pop     cx
        ret                     ;iseiti is proceduros
spausdinti        endp
;---------------------------------------------------------------------
;; nuskaito skaicius ir grazina kaip AX
get_sk proc    near
    
            push    cx          ;talpina i steka (saugoti registrus)
            push    bx
            push    dx          
            xor     bx,bx       ;"isimtinis arba" (cia isvalo bx)
get_simb:   mov     ah,01h      ;skaito simb
            int     21h         ;pertraukimas
            cmp     al,'0'      ;jei maziau uz nuli eiti i 
            jl      iseiti
            cmp     al,'9'
            jg      iseiti
            sub     al,30h      ;is simbolio gaunamas sk., atimant 48
            cbw                 ;isvalo(apnulina) ah, (vyresnysis ax baitas)
            mov     cx,ax       ;issaugom sk registre cx
            mov     ax,10       ;10 talpina i ax
            mul     bx          ;bx'e esantis sk dauginamas is 10 (ax'e) ir talpinama i ax
            add     ax,cx       
            mov     bx,ax       
            jmp     get_simb    ;nuskaityti sekanti simboli
iseiti:     mov     ax,bx       ;grazinti sk i ax
            pop     dx
            pop     bx          ;grazina buvusius registrus, isskyrus ax
            pop     cx     
            ret
get_sk endp                      
;---------------------------------------------------------------------
dbd	proc	near
	        push	si          ;i steka
	        push	di          
            or      si,si       ;logine sudetis(jei 0, tai 0; jei ne tai ne) 
            jne     ne_nulis    ;pereiti, jei ne nulis
	        mov	    ax,di       
            jmp     pabaiga
ne_nulis:
	        mov	    ax,di
	        cwd	                ;isvalo(apnulina) al, (jaunesnysis ax baitas)
	        idiv	si          ;dalina ax is si, sveikoji dalis i ax, liekana i dx
            mov     di,si
            mov     si,dx
            call    dbd
pabaiga:
	        pop	    di
	        pop	    si
	        ret
dbd	endp
;------------------------------------------------------------------------
end main
